home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1995…tember: Reference Library / Dev.CD Sep 95 RL / Dev.CD Sep 95 RL.toast / mac / Technical Documentation / develop / develop Issue 20 code / NetWare Development / NLM Client Example / LServerChooser.cp < prev    next >
Encoding:
Text File  |  1994-10-06  |  9.2 KB  |  411 lines  |  [TEXT/MPCC]

  1. // ===========================================================================
  2. //    LServerChooser.cp            A window for selecting a NetWare server
  3. // ===========================================================================
  4. //
  5. //    This program is NOT necessarily the model of good programming.  The attention
  6. //    has been spent on the server side.  However, if you wish to use this
  7. //    as a starter program, feel free.
  8. //
  9. //    This program was written with Metrowerks C/C++ for 68k, using the
  10. //    PowerPlant class hierarchy.
  11. //
  12. //    It was written by Nick Brosnahan and Jamie Osborne. 9/94
  13. //
  14. // Apple Computer, Inc. makes no warranties about the the fitness of this code
  15. // for any purpose and will not be held liable for any damages you may suffer
  16. // from using this code.  Furthermore, Apple Computer, Inc. will not be held
  17. // liable for the death of Elvis or any other space alien.
  18. //
  19. // Your mileage may vary.
  20.  
  21. #include "LServerChooser.h"
  22. #include "NLMClientApp.h"
  23. #include "NetLister.h"
  24. #include <LStdControl.h>
  25. #include <LCaption.h>
  26. #include <LEditField.h>
  27. #include <PP_Messages.h>
  28.  
  29. #ifndef __TYPES__
  30. #include <Types.h>
  31. #endif
  32.  
  33. #ifndef __PACKAGES__
  34. #include <Packages.h>
  35. #endif
  36.  
  37. #include <stdlib.h>
  38. #include <stdio.h>
  39.  
  40. // additions
  41.  
  42. #include <string.h>
  43.  
  44. const ResIDT    WIND_ServerActions    = 1001;
  45. const MessageT    msg_ZoneChosen = 2001;
  46.  
  47. extern NLMClientApp *gApplication;
  48.  
  49. // ---------------------------------------------------------------------------
  50. //        • CreateAppWindowStream [static]
  51. // ---------------------------------------------------------------------------
  52. //    Return a new AppWindow object initialized using data from a Stream
  53.  
  54. LServerChooser*
  55. LServerChooser::CreateServerChooserStream(
  56.     LStream    *inStream)
  57. {
  58.     return (new LServerChooser(inStream));
  59. }
  60.  
  61.  
  62. // ---------------------------------------------------------------------------
  63. //        • LServerChooser
  64. // ---------------------------------------------------------------------------
  65. //    Default Constructor
  66.  
  67. LServerChooser::LServerChooser()
  68. {
  69.     mZoneCounter = mServerCounter = 0;
  70. }
  71.  
  72.  
  73. // ---------------------------------------------------------------------------
  74. //        • LServerChooser(SWindowInfo&)
  75. // ---------------------------------------------------------------------------
  76. //    Construct DialogBox from the data in a struct
  77.  
  78. LServerChooser::LServerChooser(
  79.     SWindowInfo    &inWindowInfo)
  80.         : LDialogBox(inWindowInfo)
  81. {
  82.     mZoneCounter = mServerCounter = 0;
  83. }
  84.  
  85.  
  86. // ---------------------------------------------------------------------------
  87. //        • LServerChooser(ResIDT, Uint32, LCommander*)
  88. // ---------------------------------------------------------------------------
  89. //    Construct a DialogBox from a WIND Resource with the specified attributes
  90. //    and SuperCommander
  91. //
  92. //    Side Effect: Created window becomes the current port
  93.  
  94. LServerChooser::LServerChooser(
  95.     ResIDT        inWINDid,
  96.     Uint32        inAttributes,
  97.     LCommander    *inSuper)
  98.         : LDialogBox(inWINDid, inAttributes, inSuper)
  99. {
  100.     mZoneCounter = mServerCounter = 0;
  101. }
  102.  
  103.  
  104. // ---------------------------------------------------------------------------
  105. //        • LServerChooser(LStream*)
  106. // ---------------------------------------------------------------------------
  107. //    Construct a DialogBox from the data in a Stream
  108.  
  109. LServerChooser::LServerChooser(
  110.     LStream    *inStream)
  111.         : LDialogBox(inStream)
  112. {
  113.     mZoneCounter = mServerCounter = 0;
  114. }
  115.  
  116.  
  117. // ---------------------------------------------------------------------------
  118. //        • ~LServerChooser
  119. // ---------------------------------------------------------------------------
  120. //    Destructor
  121.  
  122. LServerChooser::~LServerChooser()
  123. {
  124.     if (zoneList)
  125.     {
  126.         free(zoneList);
  127.         CloseZoneList();
  128.     }
  129.     if (serverList)
  130.     {
  131.         free(serverList);
  132.         CloseNBPList();
  133.     }
  134. }
  135.  
  136. void LServerChooser::ListenToMessage(
  137.     MessageT    inMessage,
  138.     void        *ioParam)
  139. {    
  140.     LServerActions    *serverActions = NULL;
  141.     Cell firstCell;
  142.     firstCell.h = 0;
  143.     firstCell.v = 0;
  144.     
  145.     switch (inMessage)
  146.     {
  147.         case msg_OK:
  148.             serverActions = DoOKHit();
  149.             if (serverActions)
  150.             {
  151.                 DoClose();
  152.                 serverActions->Show();
  153.                 serverActions->DoClient();
  154.             }
  155.             break;
  156.         case msg_Cancel:
  157.             DoClose();
  158.             break;
  159.         case msg_ZoneChosen:
  160.             RefreshServerList();
  161.             break;
  162.         default:
  163.             if (GetSuperCommander() != nil) 
  164.                 GetSuperCommander()->ProcessCommand(inMessage, ioParam);
  165.             break;
  166.     }
  167. }
  168.  
  169. void LServerChooser::DoSetupServerChooser()
  170. {
  171.     DoSetupZoneList();
  172.     
  173.     DoSetupServerList();
  174.         
  175.     mOKButton = (LStdButton *)this->FindPaneByID('okay');
  176.     mOKButton->SetValueMessage(msg_OK);
  177.     mOKButton->AddListener(this);
  178.  
  179.     mCancelButton = (LStdButton *)this->FindPaneByID('cncl');
  180.     mCancelButton->SetValueMessage(msg_Cancel);
  181.     mCancelButton->AddListener(this);
  182.     
  183.     this->SetDefaultButton (mOKButton->GetPaneID());
  184.  
  185.     Show();
  186.     StartIdling();
  187. }
  188.  
  189. void LServerChooser::DoSetupZoneList()
  190. {
  191.     short i;
  192.     Cell selectedCell;
  193.     Str255 currentZone;
  194.  
  195.     mZonesList = (LListBox *)this->FindPaneByID('zone');
  196.     mZonesList->SetDoubleClickMessage(msg_ZoneChosen);
  197.     mZonesList->AddListener(this);
  198.  
  199.     // Create Zone List stuff
  200.     
  201.     zoneList = (ZoneElem *)malloc(sizeof(ZoneElem)*400);
  202.     OpenZoneList(zoneList, 400);
  203.  
  204.     numZones = ZoneListSize();
  205.  
  206.     LAddColumn(1, 1, mZonesList->GetMacListH());
  207.     LAddRow(numZones, 1, mZonesList->GetMacListH());
  208.  
  209.     RefreshZoneList();
  210.     
  211.     GetMyLocalZone(localZone);
  212.     
  213.     for (i=0; i<numZones; i++)
  214.     {
  215.         selectedCell.h = 0;
  216.         selectedCell.v = i;
  217.         
  218.         mZonesList->SelectOneCell(selectedCell);
  219.         mZonesList->GetDescriptor(currentZone);
  220.  
  221.         if (strcmp (p2cstr(localZone), p2cstr(currentZone)) == 0)
  222.         {
  223.             c2pstr((char *)localZone);
  224.             c2pstr((char *)currentZone);
  225.             mZonesList->MakeCellVisible(selectedCell);
  226.             break;
  227.         }
  228.         else
  229.         {
  230.             c2pstr((char *)localZone);
  231.             c2pstr((char *)currentZone);
  232.         }
  233.     }
  234. }
  235.  
  236. void LServerChooser::RefreshZoneList()
  237. {
  238.     Cell selectedCell;
  239.     short i = 0;
  240.     
  241.     UpdateZoneList();
  242.     
  243.     if (numZones < ZoneListSize())
  244.     {
  245.         LAddRow(ZoneListSize() - numZones, 1, mZonesList->GetMacListH());
  246.     }
  247.     else if (numZones > ZoneListSize())
  248.     {
  249.         LDelRow(numZones - ZoneListSize(), 1, mZonesList->GetMacListH());
  250.     }
  251.     
  252.     numZones = ZoneListSize();
  253.     
  254.     for (i=0; i<numZones; i++)
  255.     {
  256.         selectedCell.h = 0;
  257.         selectedCell.v = i;
  258.         
  259.         mZonesList->SelectOneCell(selectedCell);
  260.         mZonesList->SetDescriptor(zoneList[i].zoneName);
  261.     }
  262.     
  263. //    mZonesList->Refresh();    
  264. }
  265.  
  266. void LServerChooser::DoSetupServerList()
  267. {
  268.     mServersList = (LListBox *)this->FindPaneByID('serv');
  269.     mServersList->SetDoubleClickMessage(msg_OK);
  270.     mServersList->AddListener(this);
  271.  
  272.     serverList = (NBPElem *)malloc(sizeof(NBPElem) * 100);
  273.  
  274.     OpenNBPList(localZone, "\pATDEMO_Server.NATIVE", serverList, 100);
  275.  
  276.     // Setup server pane
  277.  
  278.     numServers = NBPListSize();
  279.  
  280.     LAddColumn(1, 1, mServersList->GetMacListH());
  281.     LAddRow(numServers, 1, mServersList->GetMacListH());
  282.  
  283. }
  284.  
  285. void LServerChooser::RefreshServerList()
  286. {
  287.     Cell selectedCell;
  288.     short i = 0;
  289.     Str255 currentZone;
  290.     
  291.     mZonesList->GetDescriptor(currentZone);
  292.     
  293.     if (strcmp (p2cstr(localZone), p2cstr(currentZone)) != 0)
  294.     {
  295.         c2pstr((char *)localZone);
  296.         c2pstr((char *)currentZone);    
  297.         
  298.         LDelRow(numServers, 1, mServersList->GetMacListH());
  299.         numServers = 0;
  300.         
  301.         mServersList->Refresh();
  302.         
  303.         CloseNBPList();
  304.         OpenNBPList(currentZone, "\pATDEMO_Server.NATIVE", serverList, 100);
  305.     }
  306.     else
  307.     {
  308.         c2pstr((char *)localZone);
  309.         c2pstr((char *)currentZone);    
  310.     }
  311.     
  312.     UpdateNBPList();
  313.     
  314.     if (numServers < NBPListSize())
  315.     {
  316.         LAddRow(NBPListSize() - numServers, 1, mServersList->GetMacListH());
  317.     }
  318.     else if (numServers > NBPListSize())
  319.     {
  320.         LDelRow(numServers - NBPListSize(), 1, mServersList->GetMacListH());
  321.     }
  322.     
  323.     numServers = NBPListSize();
  324.     
  325.     for (i=0; i<numServers; i++)
  326.     {
  327.         selectedCell.h = 0;
  328.         selectedCell.v = i;
  329.         
  330.         mServersList->SelectOneCell(selectedCell);
  331.         mServersList->SetDescriptor(serverList[i].nbpName);
  332.     }
  333.     if (numServers && (mServersList->GetValue() != -1))
  334.     {
  335.         mOKButton->Enable();
  336.         mOKButton->Refresh();
  337.     }
  338.     else
  339.     {
  340.         mOKButton->Disable();
  341.         mOKButton->Refresh();
  342.     }    
  343. }
  344.  
  345. void LServerChooser::SpendTime(const EventRecord &inMacEvent)
  346. {
  347.     if (mServerCounter++ > 100)
  348.     {
  349.         mServerCounter = 0;
  350.         RefreshServerList();
  351.         if (mZoneCounter++ > 5)
  352.         {
  353.             mZoneCounter = 0;
  354.         }
  355.     }
  356. }
  357.  
  358. LServerActions *LServerChooser::DoOKHit()
  359. {
  360.     LServerActions    *serverActions;
  361.     ATAddress    addr;
  362.     Str32        serverName;
  363.     Str32        zoneName;
  364.     Cell firstCell;
  365.     Cell selectedCell;
  366.     firstCell.h = 0;
  367.     firstCell.v = 0;
  368.  
  369.     mServersList->GetLastSelectedCell(selectedCell);
  370.     mServersList->SelectOneCell(selectedCell);
  371.     mServersList->GetDescriptor(serverName);
  372.     mZonesList->GetLastSelectedCell(selectedCell);
  373.     mZonesList->SelectOneCell(selectedCell);
  374.     mZonesList->GetDescriptor(zoneName);
  375.     FindServerAddress(serverName, zoneName, &addr);
  376.     StopIdling();
  377.     
  378.     serverActions = (LServerActions *)LServerActions::CreateWindow(WIND_ServerActions, gApplication);
  379.     serverActions->DoSetupServerActions(addr);
  380.     serverActions->SetDescriptor(serverName);
  381.     
  382.     return serverActions;
  383. }
  384.  
  385. void FindServerAddress(Str32 name, Str32 zone, ATAddress *addr)
  386. {
  387.     MPPParamBlock pb;
  388.     EntityName entity;
  389.     char buff[1000];
  390.     OSErr stat;
  391.     EntityName ename;
  392.  
  393.     NBPSetEntity((Ptr)&entity, (Ptr) name, (Ptr) "\pATDEMO_Server.NATIVE", (Ptr)zone);
  394.     
  395.     memset(&pb, 0, sizeof(pb));
  396.     pb.NBPentityPtr = (Ptr)&entity;
  397.     pb.NBPretBuffPtr = buff;
  398.     pb.NBPretBuffSize = 1000;
  399.     pb.NBPmaxToGet = 1;
  400.     pb.NBPinterval = 8;
  401.     pb.NBPcount = 3;
  402.  
  403.     stat = PLookupName(&pb, false);
  404.     Assert_(!stat);
  405.  
  406.     Assert_(pb.NBPnumGotten);
  407.     stat = NBPExtract((Ptr)buff, pb.NBPnumGotten, 1, &ename, addr);
  408.     Assert_(!stat);
  409. }
  410.  
  411.